import os

import yaml

sysPath = os.getcwd()
tempPath = f"{sysPath}/storage/temp"
structurePath = f"{sysPath}/pkg/structure"
protobufPath = f"{sysPath}/protobuf"


def to_camel(val: str) -> str:
    return "".join([k.capitalize() for k in val.split('_')])


def load_conf():
    conf_path = f"{tempPath}/tem.yaml"
    with open(conf_path, 'r', encoding='utf-8') as f:
        cfg = f.read()

    cfg = yaml.load(cfg, Loader=yaml.FullLoader)

    cfg_camel = {}

    for key, val in cfg.items():
        key = to_camel(key).lower()
        cfg_camel[key] = [to_camel(v) for v in val]

    return cfg, cfg_camel


# 生成对应的数据结构proto文件
def mk_structure(cfg_camel):
    for key, value in cfg_camel.items():
        proto_path = f"{protobufPath}/{key}.proto"
        if not os.path.exists(proto_path):  # 如果这个文件不存在
            '''生成对应的数据结构proto文件'''
            file = open(proto_path, 'w')
            file.write('syntax = "proto3";\nimport "base.proto";\noption go_package = "pkg/proto";\n')
            for v in value:
                file.write('\nmessage ' + v + 'Request ' + '{\n  BaseKey key = 1;\n}\n')
                file.write('\nmessage ' + v + 'Response ' + '{\n}\n')
            file.close()

        else:  # 如果这个文件存在
            '''更新数据结构proto文件'''
            with open(proto_path) as f:
                line = f.readlines()
            f.close()
            for v in value:
                function = v + 'Request'
                flag = 0
                for l in line:
                    if function in l:
                        flag = 1
                        break
                if flag == 0:
                    file = open(proto_path, 'a')
                    file.write('\nmessage ' + v + 'Request ' + '{\n  BaseKey key = 1;\n}\n')
                    file.write("\nmessage %sResponse {\n}\n" % v)
                    file.close()

        print(f"{key}.proto", "-> success")


def mk_storage(cfg_camel):
    storagePath = f"{protobufPath}/storage.proto"
    file = open(storagePath, 'w')
    file.write(
        '// Code generated by gen-struct. DO NOT EDIT.\n// make gen-protobuf generated\n\nsyntax = "proto3";\n\noption go_package = "pkg/proto";\n\n')
    for key, value in cfg_camel.items():
        file.write('import "' + key + '.proto";\n')
    file.write('\n\nservice CommServer {\n')
    for key, value in cfg_camel.items():
        for v in value:
            file.write('  rpc ' + v + ' (' + v + 'Request) returns (%s);\n' % "{}Response".format(v))
    file.write('}')
    file.close()
    print("storage.proto", "-> success")


if __name__ == "__main__":
    _, cfg_camel = load_conf()
    mk_structure(cfg_camel)  # 生成对应的数据结构proto文件
    mk_storage(cfg_camel)
